#include "../include/car.h"

Car::Car() : basePlate(), agx(), binocularCamera(), ladar(), gyroscope(), lcd(), battery() {
    // // 增加观察者
    this->ladar.Attach(this->basePlate.getDecision());
}

Car::Car(BasePlate basePlate, AGX agx, BinocularCamera binocularCamera,
         Ladar ladar, Gyroscope gyroscope, LCD lcd, Battery battery)
{
    this->basePlate = basePlate;
    this->battery = battery;
    this->agx = agx;
    this->binocularCamera = binocularCamera;
    this->gyroscope = gyroscope;
    this->ladar = ladar;
    this->lcd = lcd;

    // // 增加观察者
    this->ladar.Attach(this->basePlate.getDecision());
    // this->ladar.setSubjectState(1);
}

void Car::setID(const std::string &id)
{
    this->id = id;
}
void Car::setBasePlateID(const std::string &id)
{
    this->basePlate.setId(id);
}
// 屏幕输出
void Car::print()
{
    std::cout << "\ncar信息:\n"
              << "ID: " << id << std::endl;
    basePlate.print();
    agx.print();
    binocularCamera.print();
    ladar.print();
    gyroscope.print();
    lcd.print();
    battery.print();
}
// 本地文件保存
void Car::save(const std::string &filename)
{
    // 打开一个输出文件流
    std::ofstream file(filename, std::ios::app);
    if (!file.is_open())
    {
        std::cout << "未找到文件！" << std::endl;
        return;
    }

    /*
        写入的内容，即一辆小车的全部信息。这里和实践1的用结构体实现有区别，当时是把学生和对应小车信息一起记录进去的.
        这里使用类，而且两个类都有自己的save函数，所以需要分开了，各自save各自的。但是也不用保存到不同的文件里，
        只需要学生、小车在write方法里，交替记录，就可以了，依旧保持map上保存的关系
    */
    // 记录id
    file << "," << id;
    // 关闭文件流
    file.close();

    // 调用其他部分的save，完成其他部分的save
    basePlate.save(filename);
    agx.save(filename);
    binocularCamera.save(filename);
    ladar.save(filename);
    gyroscope.save(filename);
    lcd.save(filename);
    battery.save(filename);
}

void Car::test(int order){
    this->ladar.setSubjectState(order);
    // std::cout << this->ladar.getSubjectState() << std::endl;
}